// 文件名--》browserUtil.js

/**
 * 日志类--在控制台打印日志
 */
class ConsoleLogger{
    /**
     * 设置默认值为true
     * @param enabled
     */
    constructor(enabled = true,tag = "") {
        this.enabled = enabled;
        this.tag = tag;
    }

    /**
     * 启用日志
     * @param enabled
     */
    setEnabled(enabled) {
        // 是否启用日志
        this.enabled = enabled;
    }

    /**
     * 设置标签
     * @param tag
     */
    setTag(tag){
        this.tag = tag;
    }

    log(...message) {
        if (this.enabled) {
            console.log(this.tag,...message);
        }
    }

    debug(...message) {
        if (this.enabled) {
            console.debug(this.tag,...message);
        }
    }

    info(...message) {
        if (this.enabled) {
            console.info(this.tag,...message);
        }
    }

    error(...message) {
        if (this.enabled) {
            console.error(this.tag,...message);
        }
    }
}

/**
 * 浏览器工具类
 * 这边都是 static 方法
 *
 * 带_线的方法，约定为私有方法，无法阻止外部调用
 *
 * 备注:
 *   内部使用了  window 中携带的一些对象
 */
class BrowserUtil{
    static logger = new ConsoleLogger(true,"BrowserUtil-->");
    /**
     * 在 JavaScript 中，构造方法是用于创建类实例的特殊方法，不能将其标记为私有或不可构造。构造方法必须是公共的，并使用类名作为方法名。
     * 在 ECMAScript 2022 中，私有类构造方法是一种新的特性。你可以使用 # 前缀将类构造方法标记为私有。
     */
    // #constructor() {
    //     console.log("BrowserUtil 构造方法");
    // }



    /**
     * 打印信息非常多，请谨慎调用
     * 方法内部用到了 window 对象，如果不存在贼会错误
     */
    static printWindowAllObject(){
        const logger =  BrowserUtil.logger;
        logger.log("printWindowAllObject()");
        // 定义内部方法(这个方法被嵌套调用)
        function printObject(obj, indent = '') {
            // 要对 obj 进行判断
            for (const key in obj) {
                if (obj.hasOwnProperty(key)) {
                    const value = obj[key];
                    console.log(indent + key + ':', value);
                    if (typeof value === 'object' && value !== null && value !== obj && !Array.isArray(value)) {
                        printObject(value, indent + '  ');
                    }
                }
            }
        }
        // 打印对象
        printObject(window);
    }

    /**
     * 检查浏览器是否支持LocalStorage
     * true:支持
     * false:不支持
     * @returns {boolean}
     */
    static isLocalStorageSupported() {
        try {
            const testKey = 'BrowserUtil-test';
            localStorage.setItem(testKey, testKey);
            localStorage.removeItem(testKey);
            return true;
        } catch (e) {
            return false;
        }
    }

    /**
     *  检查浏览器是否启用了Cookie功能
     * @returns {boolean}
     */
    static isCookieEnabled() {
        const cookieEnabled = navigator.cookieEnabled;
        if (!cookieEnabled) {
            document.cookie = 'BrowserUtil-->cookie';
            return document.cookie.indexOf('BrowserUtil-->cookie') !== -1;
        }
        return true;
    }

    /**
     * 检查浏览器是否支持地理位置
     * @returns {boolean}
     */
    static isGeolocationSupported() {
        return navigator.geolocation ? true : false;
    }

    /**
     * 检查浏览器是否支持Web Audio
     * @returns {boolean}
     */
    static isWebAudioSupported() {
        return !!window.AudioContext || !!window.webkitAudioContext;
    }

    /**
     * 检查浏览器是否支持WebGL
     * @returns {boolean}
     */
    static isWebGLSupported() {
        try {
            const canvas = document.createElement('canvas');
            return !!(window.WebGLRenderingContext && (canvas.getContext('webgl') || canvas.getContext('experimental-webgl')));
        } catch (e) {
            return false;
        }
    }

    /**
     * 获取浏览器内核<br/>
     * Chrome<br/>
     * Firefox<br/>
     * Safari<br/>
     * Opera<br/>
     * Edge<br/>
     * Internet Explorer<br/>
     * Unknown Browser<br/>
     * @returns {string}
     */
    static getBrowserKernel() {
        const userAgent = navigator.userAgent;
        if (userAgent.indexOf("Chrome") !== -1) {
            return "Chrome";
        } else if (userAgent.indexOf("Firefox") !== -1) {
            return "Firefox";
        } else if (userAgent.indexOf("Safari") !== -1) {
            return "Safari";
        } else if (userAgent.indexOf("Opera") !== -1) {
            return "Opera";
        } else if (userAgent.indexOf("Edge") !== -1) {
            return "Edge";
        } else if (userAgent.indexOf("Trident") !== -1) {
            return "Internet Explorer";
        } else {
            return "Unknown Browser";
        }
    }

    /**
     * 获取运行平台<br/>
     *
     * @returns {string}
     */
    static getPlatform() {
        const userAgent = navigator.userAgent;
        if (userAgent.indexOf("Win") !== -1) {
            return "Windows";
        } else if (userAgent.indexOf("Mac") !== -1) {
            return "MacOS";
        } else if (userAgent.indexOf("X11") !== -1) {
            return "UNIX";
        } else if (userAgent.indexOf("Linux") !== -1) {
            return "Linux";
        } else {
            return "Unknown Platform";
        }
    }

    /**
     * 用于获取浏览器版本
     * @returns {string|string}
     */
    static getVersion() {
        const userAgent = navigator.userAgent;
        const versionMatch = userAgent.match(/(Chrome|Firefox|Safari|Opera|Edge|Internet Explorer)\/([\d.]+)/);
        return versionMatch ? versionMatch[2] : "Unknown Version";
    }

    /**
     * 检查浏览器是否支持2D绘制
     * @returns {boolean}
     */
    static is2DGraphicsSupported() {
        const canvas = document.createElement("canvas");
        return !!(canvas.getContext && canvas.getContext("2d"));
    }

    /**
     * 检查浏览器是否支持HTML5
     * @returns {boolean}
     */
    static isHTML5Supported() {
        return !!document.createElement("canvas").getContext;
    }

    /**
     * 打印所有的函数
     */
    static calledAllMethod(){
        const logger =  BrowserUtil.logger;
        logger.log("calledAllMethod()");
        logger.log("BrowserUtil.calledAllMethod()");
        logger.log("isLocalStorageSupported():",BrowserUtil.isLocalStorageSupported()); // 检查浏览器是否支持LocalStorage
        logger.log("检查浏览器是否启用了Cookie功能:",BrowserUtil.isCookieEnabled()); // 检查浏览器是否启用了Cookie功能
        logger.log("检查浏览器是否支持地理位置:",BrowserUtil.isGeolocationSupported()); // 检查浏览器是否支持地理位置
        logger.log("检查浏览器是否支持Web Audio:",BrowserUtil.isWebAudioSupported()); // 检查浏览器是否支持Web Audio
        logger.log("检查浏览器是否支持WebGL:",BrowserUtil.isWebGLSupported()); // 检查浏览器是否支持WebGL
        logger.log("获取浏览器内核:",BrowserUtil.getBrowserKernel()); // 获取浏览器内核
        logger.log("获取运行平台:",BrowserUtil.getPlatform()); // 获取运行平台
        logger.log("获取浏览器版本:",BrowserUtil.getVersion()); // 获取浏览器版本
        logger.log("检查浏览器是否支持2D绘制:",BrowserUtil.is2DGraphicsSupported()); // 检查浏览器是否支持2D绘制
        logger.log("检查浏览器是否支持HTML5:",BrowserUtil.isHTML5Supported()); // 检查浏览器是否支持HTML5
    }

    static calledAllMethod2(){
        console.log("calledAllMethod2()");
        console.log("BrowserUtil.calledAllMethod()");
        console.log("isLocalStorageSupported():",BrowserUtil.isLocalStorageSupported()); // 检查浏览器是否支持LocalStorage
        console.log("检查浏览器是否启用了Cookie功能:",BrowserUtil.isCookieEnabled()); // 检查浏览器是否启用了Cookie功能
        console.log("检查浏览器是否支持地理位置:",BrowserUtil.isGeolocationSupported()); // 检查浏览器是否支持地理位置
        console.log("检查浏览器是否支持Web Audio:",BrowserUtil.isWebAudioSupported()); // 检查浏览器是否支持Web Audio
        console.log("检查浏览器是否支持WebGL:",BrowserUtil.isWebGLSupported()); // 检查浏览器是否支持WebGL
        console.log("获取浏览器内核:",BrowserUtil.getBrowserKernel()); // 获取浏览器内核
        console.log("获取运行平台:",BrowserUtil.getPlatform()); // 获取运行平台
        console.log("获取浏览器版本:",BrowserUtil.getVersion()); // 获取浏览器版本
        console.log("检查浏览器是否支持2D绘制:",BrowserUtil.is2DGraphicsSupported()); // 检查浏览器是否支持2D绘制
        console.log("检查浏览器是否支持HTML5:",BrowserUtil.isHTML5Supported()); // 检查浏览器是否支持HTML5
    }

    static getAllMethodInfo(){
        // console.log("BrowserUtil.getAllMethodInfo()");
        let info = "11";
        info = info.concat("检查浏览器是否支持LocalStorage:").concat(BrowserUtil.isLocalStorageSupported().toString()).concat("\n")
            .concat("检查浏览器是否启用了Cookie功能:").concat(BrowserUtil.isCookieEnabled().toString()).concat("\n")
            .concat("检查浏览器是否支持地理位置:").concat(BrowserUtil.isGeolocationSupported().toString()).concat("\n")
            .concat("查浏览器是否支持Web Audio:").concat(BrowserUtil.isWebAudioSupported().toString()).concat("\n")
            .concat("检查浏览器是否支持WebGL:").concat(BrowserUtil.isWebGLSupported().toString()).concat("\n")
            .concat("获取浏览器内核:").concat(BrowserUtil.getBrowserKernel().toString()).concat("\n")
            .concat("获取运行平台:").concat(BrowserUtil.getPlatform().toString()).concat("\n")
            .concat("获取浏览器版本:").concat(BrowserUtil.getVersion().toString()).concat("\n")
            .concat("检查浏览器是否支持2D绘制:").concat(BrowserUtil.getVersion().toString()).concat("\n")
            .concat("检查浏览器是否支持HTML5:").concat(BrowserUtil.isLocalStorageSupported().toString()).concat("\n");
        // console.log("info:" + info);
        return info;
    }

}

export { BrowserUtil };